package com.leetcode;

/**
 * <p>
 * 【银泰面试题】 2021.3.3 面试题
 * 写一个函数将一个单向链表进行反向。要求自行编写反向的过程和设计数据结构，不要外部包和辅助函数来处理。
 * 算法思路：迭代法。先将下一节点纪录下来，然后让当前节点指向上一节点，再将当前节点纪录下来,再让下一节点变为当前节点。
 * </p>
 * @author: Sunny
 * @date: 2021/3/3
 * @version: v1.0.0
 */
public class NodeReverse {

    public static void main(String[] args) {
        Node node1 = new Node(2, null);
        Node node2 = new Node(1, node1);
        // 正向 : Node{value=1, next=Node{value=2, next=null}}
        System.out.println("正向 : " + node2);
        NodeReverse test = new NodeReverse();
        // 反向 : Node{value=2, next=Node{value=1, next=null}}
        System.out.println("反向 : " + test.reverse(node2));
    }

    /**
     * 列表反转
     * @param now
     * @return
     */
    public Node reverse(Node now) {
        Node prev = null;
        Node current = now;
        while (current != null) {
            Node temp = current.next;
            current.next = prev;
            prev = current;
            current = temp;
        }
        return prev;
    }


    public static class Node {

        /**
         * 节点值
         */
        private int value;

        /**
         * 下一个节点
         */
        private Node next;

        public Node(int value, Node next) {
            this.value = value;
            this.next = next;
        }

        @Override
        public String toString() {
            return "Node{" +
                    "value=" + value +
                    ", next=" + next +
                    '}';
        }

    }

}
